// 创建observe函数 处理对象value(被监测的对象)
// value 传入的值为 definrReactive中参数val的值
function observe (value) {
    // 如果不是对象，直接return
    if (typeof value !== 'object') return

    // 定义ob
    let ob
    if (typeof value.__ob__ !== 'undefined') {
        ob = value.__ob__ // 存储Observer实例
    } else {
        ob = new Observer(value)
    }
    return ob
}

function defineReactive (obj, key, value) {
    console.log('defineReactive', obj, key)
    if (arguments.length === 2) {
      value = obj[key]
    }

    observe(value)
    debugger
    Object.defineProperty(obj, key, {
      get () {
        console.log('getter函数', value)
        return value
      },
      set (newVal) {
        value = newVal
        observe(value)
        console.log('setter函数', value)
      }
    })
  }

// eslint-disable-next-line no-unused-vars
const def = function (obj, key, value, enumerable) {
    Object.defineProperty(obj, key, {
        value,
        enumerable,
        writerable: true,
        configurable: true
    })
}
// eslint-disable-next-line no-unused-vars
class Observer {
    constructor (value) {
     // 构造函数中的this指的是实例本身
     // 给实例添加了一个—__ob__属性，此属性是不可枚举的
    def(value, '__ob__', this, false)
     console.log('我是Observer构造器', value)
     this.walk(value)
    }

    // 遍历所有属性
    walk (value) {
        for (const k in value) {
            defineReactive(value, k)
        }
    }
}
